/*
* Promise.allSettled是 JavaScript 中的一个方法，它和Promise.all类似，也是处理多个Promise对象的组合。
* 它接收一个包含多个Promise的可迭代对象（如数组）作为参数。
*
* 主要的不同点在于，Promise.allSettled会等待所有传入的Promise都 “稳定” 下来，也就是不管这些Promise是fulfilled（成功）还是rejected（失败），
* 它都会返回一个包含每个Promise状态和结果（如果成功则为成功值，失败则为失败原因）的新Promise。
*
* 使用场景：状态检测，无需全部成功的情况(使用Promise.allSettled可以方便地获取每个操作的最终状态，而不用担心其中一个操作失败就中断整个过程)
 */

function myPromiseAllSettled(promises) {
    return new Promise((resolve, reject) => {
        let doneCount = 0
        let sum = 0
        let res = []
        if ((typeof promises[Symbol.iterator] !== 'function')){
            throw new Error('SDAS')
        }
        if (promises.length === 0) resolve([])
        promises.forEach((promise,index) => {
            sum++
            Promise.resolve(promise).then((response) => {
                doneCount++
                res[index] = {
                    status: 'fulfilled',
                    value: response
                }
            },
                (err) => {
                doneCount++
                res[index] = {
                    status: 'rejected',
                    reason: err
                }
            }).finally(() => {
                if(doneCount >= sum){
                    resolve(res)
                }
            })
        })
    })
}


const pro = new Promise((resolve, reject) => {
    setTimeout(() => {
        reject(3);
    }, 1000);
});

Promise.allSettled([pro, Promise.resolve(1), Promise.reject(2)]).then(
    (data) => {
        console.log(data);
    }
);

myPromiseAllSettled([pro, Promise.resolve(1), Promise.reject(2)]).then(
    (data) => {
        console.log(data);
    }
);
